In a computer system, the ability to control the allocation of memory resources is vital to the successful operation and scalability of the computer system as a whole. Software applications run more efficiently in environments in which steps are taken to proactively manage available memory resources to ensure that only those entities that are currently being used are stored in memory, while little-used entities are cleanly removed. In some systems and virtual machines, for example, the Java™ Virtual Machine (commonly referred to as a JVM), the system periodically performs a garbage collection. During this process the virtual machine scans the entire memory and finds which objects have been stored in the memory, and which objects the program can no longer address. These areas of memory are then returned for subsequent use by the system.
Current techniques of garbage collection are limited in their abilities to clean the memory, and do not adequately respond to variations in the underlying system. As such, new techniques are needed which can better take into account adaptive variations in the system, and which may be incorporated into existing computer system and virtual machine environments. Some existing approaches address this problem by providing the system administrators (i.e. the users) with a variety of startup options by which the user can customize the operation of their system. However, the individual user requirements have generally increased overtime as to wanting a greater number of startup options, and options that are more specialized for their application needs. The consequence is that the number of startup options for any particular system is typically quite large, and configuration of that system takes an unacceptable amount of time. Other existing approaches may utilize reinforcement learning to determine a best set of options. However, reinforcement learning can occasionally allow a system to stray down the wrong path before finally achieving the desired performance goal.
What is needed then, is a technique by which the design of the virtual machine can satisfy an increasingly larger variety of applications (e.g. Java applications), without requiring the user to choose from a confusing variety of startup options. In addition, the technique should reduce the need for the user having to specify those startup options, while at the same time consistently improving, or at least not reducing, overall system performance.